package com.uuah.server.config.spring.parsers.processors;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import org.w3c.dom.Attr;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;

import com.uuah.server.config.spring.parsers.PreProcessor;
import com.uuah.server.config.spring.parsers.assembly.configuration.IPropertyConfiguration;
import com.uuah.server.util.spring.SpringXMLUtils;

/**
 * If this attribute is present, no other can be
 */
public class CheckExclusiveAttribute implements PreProcessor {

	public static final int NONE = -1;
	private String attribute;

	public CheckExclusiveAttribute(String attribute) {
		this.attribute = attribute;
	}

	public void preProcess(IPropertyConfiguration config, Element element) {
		List foundAttributes = new LinkedList();
		boolean found = false;

		NamedNodeMap attributes = element.getAttributes();
		for (int i = 0; i < attributes.getLength(); i++) {
			String alias = SpringXMLUtils.attributeName((Attr) attributes
					.item(i));
			if (!config.isIgnored(alias)) {
				if (attribute.equals(alias)) {
					found = true;
				} else {
					foundAttributes.add(alias);
				}
			}
		}

		if (found && foundAttributes.size() > 0) {
			StringBuffer message = new StringBuffer("The attribute '");
			message.append(attribute);
			message.append("' cannot appear with the attribute");
			if (foundAttributes.size() > 1) {
				message.append("s");
			}
			Iterator others = foundAttributes.iterator();
			while (others.hasNext()) {
				message.append(" '");
				message.append(others.next());
				message.append("'");
			}
			message.append(" in element ");
			message.append(SpringXMLUtils.elementToString(element));
			message.append(".");
			throw new CheckExclusiveAttributeException(message.toString());
		}
	}

	public static class CheckExclusiveAttributeException extends
			IllegalStateException {

		private CheckExclusiveAttributeException(String message) {
			super(message);
		}

	}

}